package top.ysh.comsumer;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 消费者
 */
public class Consumer_PubSub1 {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1. 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 2. 设置参数
        factory.setHost("192.168.23.131");  // docker容器宿主机ip，不设置参数默认localhost
        factory.setPort(5672);    // 端口，默认：5672
        factory.setVirtualHost("/");    // 虚拟机，默认值： /
        factory.setUsername("guest");    // 用户名，默认值：guest
        factory.setPassword("guest");    // 密码，默认值：guest
        // 3. 创建连接 Connection
        Connection connection = factory.newConnection();
        // 4. 创建 Channel,和生产者的Channel不同
        Channel channel = connection.createChannel();
        String queue1Name = "test_fanout_queue1";

        // 6. 接收消息
        /*
        String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException;
        参数：
            1. queue：队列名称
            2. autoAck：是否自动确认，告诉提供方MQ，消息已收到
            3. callback：回调对象
         */
        Consumer consumer = new DefaultConsumer(channel) {
            /*
                回调方法：当收到消息后会自动执行该方法
                参数：
                    1. consumerTag：唯一标识
                    2. envelope：获取一些信息，交换机，路由key...
                    3. properties：配置信息
                    4. body：数据
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("body = " + new String(body));
                System.out.println("将日志信息打印到控制台.....");

            }
        };
        channel.basicConsume(queue1Name, true, consumer);

        // 消费者是否需要关闭连接？不要
    }
}
